#ifndef MYLIB_DEVICE_JY61P_H
#    define MYLIB_DEVICE_JY61P_H

#    include "main.h"

#    include <stdint.h>

// 如果没有修改，那么默认就是0x50
#    define JY61P_DEFAULT_ADDRESS 0x50

typedef struct{
    void* huart; // 串口句柄，STM32上为UART_HandleTypeDef*类型，而MSPM0上为UART_Regs*类型。
    void (*uart_send_bytes_func)(uint8_t* bytes, int32_t len); // 发送len个bytes开头的字节的函数
    void (*delay_ms_func)(uint32_t ms); // 毫秒延迟函数
}jy61p_t;

// 结构体初始化器
// 使用方法：
// jy61p_t jy61p = DEVICE_JY61P_INITIALIZER(huart, uart_send_bytes, delay_ms);
#define DEVICE_JY61P_INITIALIZER(uart, uart_send_bytes, delay_ms) {\
    .huart = uart, \
    .uart_send_bytes_func = uart_send_bytes,\
    .delay_ms_func delay_ms\
    }

// 初始化jy61p结构体
void jy61p_init(jy61p_t* jy61p, void* huart, 
    void (*uart_send_bytes_func)(uint8_t*, int32_t), 
    void (*delay_ms_func)(uint32_t));


// 从jy61p获取数据，调用以后会把数据解析并且计算好，之后存储在内部
void jy61p_get_data(jy61p_t* jy61p);

// 从内部获取三维加速度数据，参数为用于存储数据的变量
void jy61p_get_acc(float* ax, float* ay, float* az);

// 从内部获取三维角速度数据，参数为用于存储数据的变量
void jy61p_get_gyro(float* gx, float* gy, float* gz);

// 从内部获取三维角度数据，参数为用于存储数据的变量
void jy61p_get_angle(float* ax, float* ay, float* az);

// 中断函数，需要在串口中断里调用
void jy61p_irq_handler(void);

// 将偏航角Yaw置零
void jy61p_clear_yaw(jy61p_t* jy61p);

#endif   // !MYLIB_DEVICE_JY61P_H
